#!/usr/bin/env python3
"""
读取 Mac Keychain 中 Claude Code 的凭据
"""

import subprocess
import json
import sys

def get_claude_credentials():
    """
    从 Keychain 中获取 Claude Code 的凭据
    """
    try:
        # 使用 security 命令查找密码项
        result = subprocess.run([
            'security', 
            'find-generic-password',
            '-s', 'Claude Code-credentials',  # 服务名称
            '-w'  # 只输出密码内容
        ], capture_output=True, text=True, check=True)
        
        # 获取密码内容（通常是 JSON 格式）
        password_data = result.stdout.strip()
        
        # 尝试解析为 JSON
        try:
            credentials = json.loads(password_data)
            return credentials
        except json.JSONDecodeError:
            # 如果不是 JSON，直接返回原始字符串
            return password_data
            
    except subprocess.CalledProcessError as e:
        if "could not be found" in e.stderr:
            print("错误: 在 Keychain 中找不到 'Claude Code-credentials'", file=sys.stderr)
        else:
            print(f"错误: {e.stderr}", file=sys.stderr)
        return None
    except Exception as e:
        print(f"未知错误: {e}", file=sys.stderr)
        return None

def get_detailed_info():
    """
    获取更详细的 Keychain 项信息
    """
    try:
        result = subprocess.run([
            'security',
            'find-generic-password', 
            '-s', 'Claude Code-credentials',
            '-g'  # 显示密码和属性
        ], capture_output=True, text=True)
        
        # security 命令将密码输出到 stderr
        return {
            'attributes': result.stdout,
            'password': result.stderr
        }
    except Exception as e:
        print(f"获取详细信息失败: {e}", file=sys.stderr)
        return None

if __name__ == "__main__":
    print("正在读取 Claude Code 凭据...")
    
    # 获取凭据
    credentials = get_claude_credentials()
    
    if credentials:
        print("\n成功获取凭据:")
        if isinstance(credentials, dict):
            # 格式化输出 JSON
            print(json.dumps(credentials, indent=2))
            
            # 如果包含 token 信息，显示部分内容
            if 'access_token' in credentials:
                token = credentials['access_token']
                print(f"\nAccess Token (前20字符): {token[:20]}...")
            if 'refresh_token' in credentials:
                token = credentials['refresh_token']
                print(f"Refresh Token (前20字符): {token[:20]}...")
        else:
            # 显示原始字符串（部分）
            print(f"凭据内容 (前50字符): {credentials[:50]}...")
    
    # 可选：显示详细信息
    if '--verbose' in sys.argv:
        print("\n详细信息:")
        info = get_detailed_info()
        if info:
            print(info['attributes'])